// hc_sr_trig 模块定义开始，用于生成超声波触发信号
//   Description  ﹕超声波触发测距模块
// 波形周期 300ms，前 15us 高电平
module hc_sr_trig (
    input logic clk_us,    // 输入 1MHz 系统时钟
    input logic Rst_n,     // 输入复位信号，低电平有效
    
    output logic trig      // 输出触发测距信号
);

    // 参数声明 300_000*1_000ns = 3 *10^8ns = 0.3s = 300ms
    // 波形周期 300ms，前 10us 高电平
    // 建议测量周期为 60ms 以上，以防止发射信号对回响信号的影响。
    parameter int CYCLE_MAX = 19'd300_000; // 定义触发信号的一个周期计数，基于 1MHz 时钟

    // 内部线网/寄存器声明
    logic [18:0] cnt;       // 计数器，用于生成触发信号的时间控制
    logic add_cnt;          // 计数器使能信号
    logic end_cnt;          // 计数器结束信号，达到预定义周期时有效

    // 计数器逻辑，用于控制触发信号的产生
    always_ff @(posedge clk_us, negedge Rst_n) begin
        if (!Rst_n) begin    // 如果复位信号有效，则计数器清零
            cnt <= '0;
        end else if (add_cnt) begin  // 如果计数器使能
            if (end_cnt) begin       // 如果计数器达到预定义的最大周期
                cnt <= '0;           // 计数器重置
            end else begin
                cnt <= cnt + 1'b1;   // 否则计数器递增
            end
        end else begin
            cnt <= cnt;              // 如果计数器未使能，则保持当前值
        end
    end

    assign add_cnt = 1'b1;           // 赋值计数器使能信号，始终使计数器有效
    assign end_cnt = add_cnt && (cnt == CYCLE_MAX - 9'd1); // 赋值计数器结束信号，当计数器值达到 CYCLE_MAX - 1 时有效

    // 赋值触发信号，当计数器值小于 15 时，输出高电平，作为触发
    // cnt < 15 置为高电平，表示前 15us 为高电平，作为触发信号
    // 此逻辑基于 HC-SR04 模块的触发信号需求，通常为 10 微秒的高电平
    assign trig = (cnt < 15) ? 1'b1 : 1'b0;

    /*
        计数器 cnt 用于生成持续一定时间的触发信号 trig。当计数器小于 15 时，trig 为高电平，表示触发信号是活跃的。
        计数器在每个 1MHz 时钟的上升沿递增，当计数器达到设定的最大周期 CYCLE_MAX 时，计数器重置，重新开始计数。
        这样，trig 信号就会周期性地输出高电平脉冲，以满足 HC-SR04 超声波传感器的触发需求。
    */

endmodule